package com.levi.stream;

import com.levi.lambda.Student;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author shentong
 * @since  2022/1/11 8:01 PM
 * @desc  1.Stream()是串行流
 *              2.parallelStream 是并行流  ，cpu核数越多效率越高
 *       3.如何使用普通for循环，串行流，并行流？
 *       对于简单操作，如果机器是多核的话，建议使用Stream并行流，如果不考虑cpu核数，普通for循环效率高于stream串行流
 */
public class DemoStream {
    public static void main(String[] args) {
        //Jdk8之后查询年龄小于20岁的学生，并且根据年龄进行排序，得到学生姓名，生成新集合
        List<Student> studentList = new ArrayList<Student>() {{
            add(new Student(1, "zhangsan", "man", 19));
            add(new Student(1, "zhangsan", "man", 19));
            add(new Student(2, "lisi", "man", 16));
            add(new Student(3, "wangwu", "man", 20));
            add(new Student(4, "zhaoliu", "man", 15));
            add(new Student(5, "lufei", "man", 15));
        }};
//        anyMatch只要有一个匹配就返回true    allMatch必须所有都匹配才返回true
        List<String> collect = studentList.parallelStream()
                .filter(s -> s.getAge() < 20)//过滤出年龄小于20的学生
                .sorted(Comparator.comparing(Student::getAge)) //根据年龄排序
                .map(Student::getName)//得到学生姓名
                .distinct()//去重
                .limit(2)//从集合中取前两个元素
                .skip(1)//从集合中去掉第一个元素
//                .findAny()
                .collect(Collectors.toList());//转换成一个新的集合
        collect.forEach(System.out::println);
    }
}
